'''
合并购物车

需求：登陆的时候，将cookie数据合并到redis中

当cookie数据和redis数据有相同的商品id的时候，数量怎么办？　我们以cookie为主
当cookie数据有，redis数据没有，全部要cookie为主
当redis中有数据，cookie没有　不动

后端：
    请求：　在登录的时候，获取cookie数据

    １．读取cookie数据
    ２．初始化一个字典，用于保存sku_id:count
       初始化一个列表，用于保存选中的商品id
       初始化一个列表，用于保存未选中的商品id
    ３．遍历cookie数据
    ４．将字典数据，列表数据分别添加到redis中
    ５．删除cookie数据

    业务逻辑：　合并到redis中
'''

import pickle
import base64

from django_redis import get_redis_connection


def merge_cookie_to_redis(request,response):
    # １．读取cookie数据
    cookie_carts = request.COOKIES.get('carts')

    if cookie_carts is not None:

        carts = pickle.loads(base64.b64decode(cookie_carts.encode()))

        # ２．初始化一个字典，用于保存sku_id: count
        cookie_dict = {}

        # 初始化一个列表，用于保存选中的商品id
        selected_ids = []

        # 初始化一个列表，用于保存未选中的商品id
        unselected_ids = []

        # ３．遍历cookie数据
        for sku_id,count_selected_dict in carts.items():
            cookie_dict[sku_id] = count_selected_dict['count']

            if count_selected_dict['selected']:
                selected_ids.append(sku_id)
            else:
                unselected_ids.append(sku_id)

        # ４．将字典数据，列表数据分别添加到redis中
        redis_cli = get_redis_connection('carts')

        user = request.user

        pipeline = redis_cli.pipeline()
        pipeline.hset('carts_%s'%user.id,cookie_dict)

        if len(selected_ids)>0:
            pipeline.sadd('selected_%s'%user.id,*selected_ids)
        if len(unselected_ids)>0:
            pipeline.srem('selected_%s'%user.id,*unselected_ids)

        pipeline.execute()

        # ５．删除cookie数据
        response.delete_cookie('carts')

    return response